package com.xlf.service.base.service.importProblem;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ZipUtil;
import com.xlf.common.core.exception.BizException;
import com.xlf.common.core.util.StringUtils;
import com.xlf.common.core.util.file.UploadConfig;
import com.xlf.pojo.base.Problem;
import com.xlf.pojo.base.ProblemLanguage;
import com.xlf.pojo.constant.Constants;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;

/**
 * @Author xlf 2734029211@qq.com
 * @Date 2023/12/6 14:55
 * @Description: TODO
 * @Version 1.0
 */
public abstract class AbstractImportService {


    /**
     * 将压缩文件解压到随机生成的工作目录，并且返回工作目录
     * @param file zip格式的压缩包，压缩包内的文件不能为空
     * @return 工作目录
     */
    public String initWorkFileDir(MultipartFile file){

        //获取文件后缀
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
        if (!"zip".toUpperCase().contains(suffix.toUpperCase())) {
            throw new BizException("请上传zip格式的测试数据压缩包！");
        }

        String fileDir = initFileDir();

        // 将压缩包压缩到指定文件夹
        try {
            ZipUtil.unzip(file.getInputStream(), new File(fileDir), null);
        } catch (IOException e) {
            e.printStackTrace();
            throw new BizException("导入的工作目录建立失败！");
        }

        // 检查文件是否存在
        File testCaseFileList = new File(fileDir);

        File[] files = testCaseFileList.listFiles();
        if (files == null || files.length == 0) {
            FileUtil.del(fileDir);
            throw new BizException("压缩包里文件不能为空！");
        }

        return fileDir;
    }


    /**
     *
     * @return 一个随机名称的工作文件夹路径
     */
    public static String initFileDir(){

        String fileDirId = IdUtil.simpleUUID();
        String fileDir =  UploadConfig.getLocalPath() +
                Constants.File.TESTCASE_TMP_FOLDER.getPath() +
                File.separator + fileDirId;
        // 新建文件夹
        FileUtil.mkdir(fileDir);
        return fileDir;
    }
    /**
     * 过滤出文件夹
     * @param files 文件列表
     * @return
     */
    public HashMap<String, File> getTestcaseFile(File[] files) {
        HashMap<String, File> testcaseInfo = new HashMap<>();
        for (File tmp : files) {
            if (tmp.isDirectory()) {
                testcaseInfo.put(tmp.getName(), tmp);
            }
        }
        return testcaseInfo;
    }

    /**
     * 过滤出JSON后缀的文件
     * @param files 文件列表
     * @return
     */
    public HashMap<String, File> getJSONFile(File[] files) {
      return getFileBySuffix(files,"json");
    }

    /**
     * 过滤出指定后缀格式的文件
     * @param files 文件列表
     * @param suffix 后缀
     * @return
     */
    public HashMap<String, File> getFileBySuffix(File[] files,String suffix) {
        HashMap<String, File> problemInfo = new HashMap<>();
        for (File tmp : files) {
            if (tmp.isFile()) {
                // 检查文件是否时json文件
                if (tmp.getName().endsWith(suffix)) {
                    String tmpPreName = tmp.getName().substring(0, tmp.getName().lastIndexOf("."));
                    problemInfo.put(tmpPreName, tmp);
                }else {
                    //  FileUtil.del(fileDir);
                    //  throw new BizException("编号为：" + tmp.getName() + "的文件格式错误，请使用json文件！");
                }

            }
        }
        return problemInfo;
    }

}


